﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.IO;
using System.Net;
using System.Net.Sockets;

namespace Server
{
    public class ClientHandler
    {
        Socket klientSocket;
        IPAddress ipadresse;
        AuktionsService auktionsService;

        NetworkStream netStream;
        StreamReader reader;
        StreamWriter writer;

        bool stop=false;

        public ClientHandler(Socket klientSocket, AuktionsService auktionsService)
        {
            this.klientSocket = klientSocket;
            this.auktionsService = auktionsService;
            netStream = new NetworkStream(klientSocket);
            reader = new StreamReader(netStream);
            writer = new StreamWriter(netStream);
            string ipadressesplit = klientSocket.RemoteEndPoint.ToString(); // henter IP-adresse og port fra klienten
            string[] split = ipadressesplit.Split(':');
            ipadresse = IPAddress.Parse(split[0]); // tager kun IP-adressen
        }

        public void RunClient()
        {
            auktionsService.TilmeldKlient(this); //  tilføjer klient til listen over klienter
            Console.WriteLine(ipadresse);
            WriteData("Velkommen til auktionen. Din IP-adresse er :" + ipadresse);
            WriteData(auktionsService.HentVarebetegnelse());
            do { } while (doChat() && !stop); // så længe der modtages data fra klienten og der stadig er auktioner
            auktionsService.AfmeldKlient(this); //  fjerner klient fra liste
            Console.WriteLine("Klient logget af: " + ipadresse);
            reader.Close(); // Lukker pænt ned...
            writer.Close();
            netStream.Close();
        }

        public bool doChat()
        {
            string clientText = GetData(); // henter datastream fra klient
            if (clientText == null)
            {
                // hvis der ikke er noget i datastream, returneres false så den hopper ud af while løkken ovenover
                return false;
            }

            int bud;
            if (int.TryParse(clientText, out bud))
            {
                if (auktionsService.nytBud(bud, ipadresse.ToString())) // tjekker om buddet er legalt
                    // multicaster til klienterne
                    auktionsService.MulticastBesked("Højeste bud er " + bud + " kr. Afgivet fra " + ipadresse);
                else
                    // skriver til klienten der skrev
                    WriteData("Buddet er for lavt");
            }
            else
                WriteData("Skriv kun tal");
            return true;
        }

        public string GetData()
        {
            // prøver at hente data fra klienten, hvis det går galt, sender den null tilbage
            try
            {
                return reader.ReadLine();
            }

            catch (Exception)
            {
                return null;
            }
        }

        public void WriteData(string besked)
        {
            // skriver data til den ene klient
            writer.WriteLine(besked);
            writer.Flush();


        }

        public void KlientStop()
        {
            // når denne metode bliver kaldt, hopper klienten ud af løkken og lukker forbindelsen ned
            stop = true;
        }
    }
}
